from datetime import datetime, timedelta
from typing import Dict, Optional, Any
from itsdangerous import URLSafeTimedSerializer, BadSignature, SignatureExpired
import json

from app.utils.config_loader import config


def create_access_token(data: dict, expires_delta: Optional[timedelta] = None) -> str:
    """创建访问令牌
    
    Args:
        data: 要编码到令牌中的数据
        expires_delta: 令牌过期时间
        
    Returns:
        str: 访问令牌
    """
    # 设置过期时间（秒）
    if expires_delta:
        max_age = int(expires_delta.total_seconds())
    else:
        max_age = config.security.access_token_expire_minutes * 60
    
    # 创建序列化器
    serializer = URLSafeTimedSerializer(config.security.secret_key)
    
    # 将数据转为JSON字符串
    data_str = json.dumps(data)
    
    # 生成令牌
    token = serializer.dumps(data_str)
    
    return token


def decode_access_token(token: str) -> Dict[str, Any]:
    """解码访问令牌
    
    Args:
        token: 访问令牌
        
    Returns:
        Dict: 解码后的数据
        
    Raises:
        BadSignature: 令牌无效
        SignatureExpired: 令牌已过期
    """
    # 设置最大有效期（秒）
    max_age = config.security.access_token_expire_minutes * 60
    
    # 创建序列化器
    serializer = URLSafeTimedSerializer(config.security.secret_key)
    
    try:
        # 解析令牌
        data_str = serializer.loads(token, max_age=max_age)
        # 将JSON字符串转回为字典
        data = json.loads(data_str)
        return data
    except SignatureExpired:
        raise SignatureExpired("令牌已过期")
    except BadSignature:
        raise BadSignature("无效的令牌")
